iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0

今天,我們真的要開始我們的Spring boot開發了!

前言

在後端的架構中,跟資料庫串接一直是非常重要的項目,通常我們跟資料庫溝通的方式都是按照SQL的語法呼叫,也就是說我們需要額外學習SQL,並且配合SQL的資料庫系統與標題來寫數據,當資料庫的欄位增加,我們也要手動去調整指令,這樣當指令成千上百個,我們就要修改成千上百次。
所以在系統開發中,我們都希望專一在一個程式語言上,並且在系統的欄位有所變化時資料庫能自動跟著改變,這就是JPA的功用,讓我們能夠使用Java語法,只要簡單的引入Interface,就能夠修改,使用我們需要的資料。接下來,我們就要更詳細的說明什麼是JPA

JPA是甚麼

我們從之前的MySQL、Eclipse介紹就可以知道,資料庫與Java的開發環境是獨立出來的,若要取得資料庫的內容,我們就必須要開發所有的指令去操作這些資料庫,那有沒有辦法有一個標準統一指令,讓Java跟資料庫之間的有一個一致的溝通方法呢?因為有了這個想法,JPA就出現了。
JPA是一個Java標準規範,提供了對象關聯映射(ORM)的技術,可以將Java對象映射到數據庫中的表格,並進行數據的持久化操作。JPA本身是一個規範,不是一個具體的實現。

JPA的主要功能包括:

  • 對象關聯映射:將Java類映射到數據庫表,並將類的屬性映射到表中的列。
  • 查詢語言(JPQL):一種類似SQL的語言,用來查詢數據庫中的對象。
  • 事務管理:提供事務處理機制,確保數據操作的原子性和一致性。
  • 批量操作:支持批量插入、更新和刪除操作。

JPA的核心概念包括:

  • 實體(Entity):對應數據庫中的一個表。

  • 實體管理器(EntityManager):負責實體的CRUD操作。

  • 持久化上下文(Persistence Context):實體對象與數據庫中的行之間的關聯。

    這些看起來很抽象,但是JPA的核心觀念就是Class跟SQL table可以相互對應,並且讓Java可以根據這個Class進行操作,這個Class就是所謂的Entity。

Spring Data JPA是甚麼

Spring Data JPA 是 Spring 根據 ORM 框架和 JPA 規範而封裝的 JPA 應用框架,目的是降低存取資料層的工作量,讓開發人員只需寫出 repository 的介面,而 Spring 自動幫你實作其功能。
Spring Boot JPA是一個基於Spring Data JPA的框架,進一步簡化了JPA的使用,並與Spring生態系統緊密集成。它通過自動配置和簡單的編程模型,使開發者能夠更加方便地使用JPA來訪問數據庫。
Spring Boot JPA的特點包括:

  • 自動配置:Spring Boot自動配置了JPA相關的依賴和設置,開發者不需要手動配置數據源和EntityManager等。

  • Repository接口:Spring Data JPA提供了一套Repository接口,使得開發者可以通過簡單的接口方法來進行數據操作,如save、findAll、findById等,並且支持自動生成查詢語句。

  • 查詢方法生成:Spring Data JPA支持通過命名約定自動生成查詢方法,例如,根據方法名findByUsername,自動生成相應的SQL查詢語句。

  • 簡單的事務管理:通過@Transactional註解來管理事務,確保數據操作的一致性。

  • 與其他Spring模塊的集成:可以輕鬆地與其他Spring模塊(如Spring Security、Spring MVC等)集成,構建完整的應用程序。

    Spring Boot JPA使得數據庫訪問變得更加輕量級,適合構建現代化的微服務應用程序。開發者可以專注於業務邏輯,而不需要過多關注底層的數據庫訪問細節。

建置自己的第一個記帳功能JPA

接下來,我們就要建置自己的JPA,來設定呼叫SQL的參數。SQL本身需要兩件事情,第一個是要資料資料庫中有多少的標題,第二件事情就是要知道要對這個資料庫做什麼,我們首先要做的第一件事情就是用Java設置Entity來告訴SQL需要多少個標題。

Entity設置

要設置Entity,首先要去accounting的資料夾,創建一個資料夾名為entity,然後再新增一個Class稱為Account
https://ithelp.ithome.com.tw/upload/images/20240917/20152864nt3avAKErM.png
Java的語法裡面,有分成Class跟Interface兩個類,我們一開始要創建的是class這一類,要創建這個類,我們可以對entity按右鍵,然後選擇New->other
https://ithelp.ithome.com.tw/upload/images/20240917/20152864m7VQ6NlIfW.png
在點選Other後,要點選class
https://ithelp.ithome.com.tw/upload/images/20240917/201528644lzGVD1FJl.png
接下來會進入這個畫面,輸入我們要的名稱Account,即可創建這個類別
https://ithelp.ithome.com.tw/upload/images/20240917/20152864H2M5A4ltpt.png
接著打開這個類別,然後輸入以下的程式碼

package net.Eric.accounting.entity;

import java.time.LocalDateTime;
import java.util.Date;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name ="accounts")
public class Account {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(name = "name")
	private String name;
	
	@Column(name = "expensed")
	private Boolean expensed ;
	
	@Column(name = "category")
	private String category ;
	
	@Column(name = "amount")
	private Long amount ;
	
	@Column(name = "createdate")
	private LocalDateTime createDate;
	
	public Account() {
		
	}
	
	public Account(Long id,String name, Boolean expensed, String category, long amount,LocalDateTime createDate) {
		this.id = id;
		this.name = name;
		this.expensed = expensed;
		this.category = category;
		this.amount = amount;
		this.createDate = createDate;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public boolean getExpensed() {
		return expensed;
	}

	public void setExpensed(Boolean expensed) {
		this.expensed = expensed;
	}

	public String getCategory() {
		return category;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	public Long getAmount() {
		return amount;
	}

	public void setAmount(Long amount) {
		this.amount = amount;
	}

	public LocalDateTime getCreateDate() {
		return createDate;
	}

	public void setCreateDate(LocalDateTime createDate) {
		this.createDate = createDate;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}	
	
}

在這裡面中,主要有以下的區域,我用圖片切割給大家,一一作說明
https://ithelp.ithome.com.tw/upload/images/20240917/20152864vTrxeXbmSC.png
這裡可以分成四個區域,第一個區域是環境參數,就是引用之後Class都可以使用的資料
第二個區塊主要是告訴系統這個Class可以做什麼,像是我們使用了@Table(name = "accounts"),也就是我們要建置一個資料表,而這個資料表叫做accounts
第三個區塊就是這個資料表裡面有哪些欄位
第四個是屬於Java的操作,就是當我們呼叫這個Class的時候,我們能對這些參數做什麼操作,當我們沒有做這個動作的時候,我們就沒有辦法執行輸入與修改的操作。
當我們完成這個頁面後,我們就完成了Entity的設置,Java就會知道我們要在SQL中建立名為accounts的資料表,接下來我們要告訴Java我們能夠對資料庫做什麼樣子的操作。

Repository設置

在理解這些觀念後,我們就要來在系統中建置我們的JPA,首先要先在accounting資料夾中建立repository的資料夾,並且新增一個interface名叫AccountRepository
https://ithelp.ithome.com.tw/upload/images/20240917/201528646DZ5FvUeKf.png

創建的方法就是在Repository的資料夾中點右鍵,然後選擇Other
https://ithelp.ithome.com.tw/upload/images/20240917/20152864e6wCoHDGka.png

選擇之後選擇下方的Interface
https://ithelp.ithome.com.tw/upload/images/20240917/20152864VxP1VOpxmX.png
設置好後,我們只要在這裡輸入extends JpaRepositry<Account , Long>即完成了我們對Repository的設置。

package net.Eric.accounting.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import net.Eric.accounting.entity.Account;

public interface AccountRepository extends JpaRepository<Account, Long>{

}

當我們在輸入的時候,可能會發現JpaReository底下有紅色的字,這個時候,只要把滑鼠移到下面,然後就會出現選項讓我們選
https://ithelp.ithome.com.tw/upload/images/20240917/20152864Kxr6CJNZN3.png
這個時候只要選擇Import'JpaReository'那一行即可匯入
在這裏<>裡面代表的是我們要操作的Entity,以及Id的類別。
當我們建置完成之後,我們可以像先前教的,再次啟動專案。
https://ithelp.ithome.com.tw/upload/images/20240917/20152864jH2aLlywOI.png
https://ithelp.ithome.com.tw/upload/images/20240917/2015286437jZhVjqD8.png
在這個時候我們可能會遇到很多的問題,這個時候就是真正鍛鍊一個工程師的地方。我們可能會遇到Component沒有創立好、getter setter設置錯誤等等問題,這些就是身為一個工程是需要磨練的地方。
當我們解決的Bug越多,我們就越像是一個工程師。
然後不用擔心,把這裡出現的問題都丟給ChatGPT,讓ChatGPT來好好的處理即可。

當我們成功出現執行的畫面之後,去到我們的SQL中,就會發現Java Spring boot自動幫我們創建了資料表。
https://ithelp.ithome.com.tw/upload/images/20240917/20152864lZ5XHDofdQ.png
到這邊,我們就完成了JPA的實作了!


上一篇
Day6 MVC 框架介紹
下一篇
Day8 記帳輸入功能-創建 Service跟Controller
系列文
前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言